#include "ManejadorArchivo.h"

ManejadorArchivo::ManejadorArchivo(const string &path) {

	this->path = path;

	/*Primero intento crear los directorios por si no existen*/
	int posicionUltimoSlash = path.find_last_of("/");

	if ( posicionUltimoSlash != -1) {

		string directorios(path,0,posicionUltimoSlash);
		system(("mkdir -p " + directorios).c_str());
	}


	this->archivo.open(path.c_str() ,fstream::binary | fstream::out | fstream::in );

	if ( !this->archivo.is_open() ) {
		ofstream aux(path.c_str()); /* ver bien esto */
		if (aux.is_open()) {
			aux.close();
		}
		this->archivo.open(path.c_str() ,fstream::binary | fstream::out | fstream::in );
	}
	this->valido = this->archivo.good();
}

ManejadorArchivo::~ManejadorArchivo() {
	if ( this->archivo.is_open()){
		this->archivo.close();
	}
}

unsigned long long int ManejadorArchivo::getTamanioArchivo() {

	unsigned long long int size;
	unsigned long long int posActual = this->archivo.tellp();

	this->mutex.lock();
	 this->archivo.seekp(0 , std::ios::end);
	 size = this->archivo.tellp();
	 this->archivo.seekp(posActual);
	 this->mutex.unlock();
	return size;

}


bool ManejadorArchivo::expandirArchivo(unsigned long long int longitudArchivo){

	if ( this->getTamanioArchivo() >= longitudArchivo ){
		return false;
	}
	this->mutex.lock();
	 this->archivo.seekp(longitudArchivo, ios_base::beg);
	 this->archivo.write(" ",1);
	 this->archivo.flush();
	this->mutex.unlock();

	if (this->getTamanioArchivo() == 0) {
		this->valido = false;
	}
	return true;
}


bool ManejadorArchivo::copiarEnArchivo(unsigned long long int offset, const string &buffer) {

	this->mutex.lock();
	 this->archivo.seekp(offset,ios_base::beg);
	 this->archivo.write(buffer.c_str(),buffer.size());
	 this->archivo.flush();
	this->mutex.unlock();
	return true;
}


string ManejadorArchivo::getContenidoArchivo(unsigned long long int offset, unsigned long long int cantidadBytes){

	ifstream archivoEntrada;

	this->mutex.lock();

	archivoEntrada.open(this->path.c_str());

	if ( archivoEntrada.is_open()){

		archivoEntrada.seekg(offset,ios_base::beg);
		char* buffer;
		buffer = new char[offset];
		string stream;

		archivoEntrada.read(buffer, cantidadBytes);
		stream.append(buffer,cantidadBytes);
		delete[] buffer;
		this->mutex.unlock();
		return stream;
	}
	this->mutex.unlock();
	return "";
}

bool ManejadorArchivo::esValido() const {

	return this->valido;
}
